From 31192a56d0b25cdd326cea0811a133688a86c188 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 16 Jun 2008 15:22:41 +0100 Subject: [PATCH] vmx: Allow restore of context from a non-Intel processor. In particular, VMX requires segment 'granularity' to be set correctly, so we force it if need be in vmx_set_segment_register(). Signed-off-by: Keir Fraser --- xen/arch/x86/hvm/vmx/vmx.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 3292dc2d23..fe5c2ece94 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -616,7 +616,7 @@ static void vmx_load_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data) struct vmx_msr_state *guest_state = &v->arch.hvm_vmx.msr_state; /* restore msrs */ - guest_state->flags = data->msr_flags; + guest_state->flags = data->msr_flags & 7; guest_state->msrs[VMX_INDEX_MSR_LSTAR] = data->msr_lstar; guest_state->msrs[VMX_INDEX_MSR_STAR] = data->msr_star; guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK] = data->msr_syscall_mask; @@ -791,6 +791,9 @@ static void vmx_set_segment_register(struct vcpu *v, enum x86_segment seg, if ( !reg->attr.fields.p ) attr |= (1u << 16); + /* VMX has strict consistency requirement for flag G. */ + attr |= !!(reg->limit >> 20) << 15; + vmx_vmcs_enter(v); switch ( seg ) -- 2.30.2